﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using ExtremeEvents.Models;
using System.IO;
using System.Drawing.Imaging;
using System.Drawing;

namespace ExtremeEvents.Controllers
{    
    public class EventoController : Controller
    {
        //
        // GET: /Evento/

        public ActionResult Index()
        {
            return View();
        }

        //
        // GET: /Evento/TodosEventos
        public ActionResult TodosEventos()
        {
            //Retorna todos os eventos sem filtros
            return View(getAllEvento());
        }

        //
        // GET: /Evento/SelecionarCategoria
        public ActionResult SelecionarCategoria()
        {
            if (ModelState.IsValid)
            {
                //Lista com todas as categorias
                List<Categoria> lista_categoria = getAllCategoria();
                //Preenche o dropbox da view com a lista de categorias, com o id_categoria como key
                ViewBag.id_categoria = new SelectList(lista_categoria, "id_categoria", "descricao");
            }
            else
            {
                ModelState.AddModelError("", "Error_26: verifique se preencheu todos os campos obrigatórios corretamente.");
            }
            return View();
        }


        //
        // GET: /Evento/EventosCategoria
        public ActionResult EventosCategoria(int id_categoria)
        {
            List<Evento> lista_categoria = getEventoByCategoria(id_categoria);
            //Se não existir nenhum evento na categoria selecionada é redirecionado 
            //para uma página que informa que não existe eventos
            if (lista_categoria.Count == 0)
                return RedirectToAction("EventosCategoriaZeroCount");

            return View(lista_categoria);               
        }

        //
        // POST: /Evento/EventosCategoria
        [HttpPost]
        public ActionResult EventosCategoria(Evento vEvento)
        {
            return View();
        }

        //
        // GET: /Evento/EventosCategoria
        public ActionResult EventosCategoriaZeroCount()
        {
            return View();
        }

        //
        // GET: /Evento/Detalhe
        public ActionResult Detalhe(int id)
        {
            Evento evento = getEventoById(id);
            ViewBag.src_flyer = getFlyerAndCreate_ByEvento(id);
            ViewBag.src_foto = getFotoAndCreate_ByEvento(id);
            return View(evento);
        }

        /// <summary>
        /// Metodo para devolver os flyers do evento e criar as imagens em pasta local
        /// </summary>
        /// <param name="id_evento"></param>
        /// <returns>string[] com o caminho dos flyers</returns>
        public string[] getFlyerAndCreate_ByEvento(int id_evento)
        {
            Flyer flyer = new Flyer();
            int count = 0;
            //buffer com o caminho das imagens
            string[] src;

            ExtremeEventsIntity db = new ExtremeEventsIntity();
            //Procura flyer do evento selecionado
           db.flyers.SqlQuery("EXEC ext.sp_fe_procurarFlyer_porEvento {0}", id_evento).ToList<Flyer>();
            //Se o evento tiver flyers então inicia o algoritmo de gerar imagem
           count = db.flyers.Local.Count;
           if (count > 0)
           {            
               src = new string[count];
               //ciclo para percorrer os flyers encontrados do evento selecionado
               for (int i = 0; i < count; i++)
               {
                   //Processar o flyer em objecto flyer
                   flyer = db.flyers.Local.ElementAt(i);
                   //utiliza resource do sistema para gerar a imagem
                   System.Drawing.Bitmap img = new System.Drawing.Bitmap(new System.IO.MemoryStream(flyer.flyer_ole, false));
                   //materializa a imagem processada em um ficheiro de imagem e coloca numa pasta temporária
                   img.Save(Server.MapPath("~/Temp/Flyer") + @"\Fl" + flyer.id_flyer + ".jpg");
                   //coloca o caminho no buffer
                   src[i] = "/Temp/Flyer/Fl" + flyer.id_flyer + ".jpg";
               }

           }
           else
           {
               //Se não existir flyers mostra uma imagem default
               src = new string[1];
              src[0] = "/Images/Extreme.png";
           }

           return src;
        }

        /// <summary>
        /// Metodo para devolver as fotos do evento e criar as imagens em pasta local
        /// </summary>
        /// <param name="id_evento"></param>
        /// <returns>string[] com os caminhos das fotos</returns>
        public string[] getFotoAndCreate_ByEvento(int id_evento)
        {
            Foto foto = new Foto();
            int count = 0;
            //buffer com o caminho das imagens
            string[] src;

            ExtremeEventsIntity db = new ExtremeEventsIntity();
            //Procura flyer do evento selecionado
            db.fotos.SqlQuery("EXEC ext.sp_fe_procurarFoto_porEvento {0}", id_evento).ToList<Foto>();
            //Se o evento tiver fotos então inicia o algoritmo de gerar imagem
            count = db.fotos.Local.Count;
            if (count > 0)
            {
                src = new string[count];
                //ciclo para percorrer as fotos encontrados do evento selecionado
                for (int i = 0; i < count; i++)
                {
                    //Processar a foto em objecto foto
                    foto = db.fotos.Local.ElementAt(i);
                    //utiliza resource do sistema para gerar a imagem
                    System.Drawing.Bitmap img = new System.Drawing.Bitmap(new System.IO.MemoryStream(foto.foto, false));
                    //materializa a imagem processada em um ficheiro de imagem e coloca numa pasta temporária
                    img.Save(Server.MapPath("~/Temp/Foto") + @"\Fo" + foto.id_foto + ".jpg");
                    //coloca o caminho no buffer
                    src[i] = "/Temp/Foto/Fo" + foto.id_foto + ".jpg";
                }

            }
            else
            {
                //Se não existir fotos não mostra imagens
                src = new string[0];
                //src[0] = null;
            }

            return src;
        }

        /// <summary>
        /// Obter o evento atravez do id
        /// </summary>
        /// <param name="id"></param>
        /// <returns>Um objecto do tipo evento</returns>
        public Evento getEventoById(int id)
        {
            ExtremeEventsIntity db = new ExtremeEventsIntity();
            db.eventos.SqlQuery("EXEC ext.sp_fe_listarEventos_porId {0}", id).ToList<Evento>();
            return db.eventos.Find(id);
        }

        /// <summary>
        /// Obter todos os eventos
        /// </summary>
        /// <returns>Lista de eventos</returns>
        public List<Evento> getAllEvento()
        {
            ExtremeEventsIntity db = new ExtremeEventsIntity();
            return db.eventos.SqlQuery("EXEC ext.sp_fe_listarEventos").ToList<Evento>();
        }

        /// <summary>
        /// Obter os eventos por categoria
        /// </summary>
        /// <returns>Lista de eventos de uma categoria</returns>
        public List<Evento> getEventoByCategoria(int id)
        {
            ExtremeEventsIntity db = new ExtremeEventsIntity();
            return db.eventos.SqlQuery("EXEC ext.sp_fe_listarEventos_porCategoria {0}", id).ToList<Evento>();
        }

        /// <summary>
        /// Método para devolver todas as categorias do evento
        /// </summary>
        /// <returns>Uma lista do tipo Categoria</returns>
        public List<Categoria> getAllCategoria()
        {
            ExtremeEventsIntity db = new ExtremeEventsIntity();
            return db.categorias.SqlQuery("EXEC ext.sp_fe_listarCategorias").ToList<Categoria>();
        }
    }
}